package com.itbaizhan.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itbaizhan.pojo.CommonResult;
import com.itbaizhan.pojo.Orders;
import com.itbaizhan.service.IOrderService;

import java.util.concurrent.atomic.AtomicInteger;

/*接口实现类
* 订单的业务层*/
/*设置超时时间解决服务雪崩
在服务生产者端@Service(timeout = 3000)配置   ，dubbo默认是1秒
不要在消费端@Reference(timeout = 2000)配置，因为操作数据库在生产端，测试后才写超时时间更合理
在生产端配置时间时，要略大于测试时间*/
/*retries :重试机制，dubbo默认会重试2次，在这里设軒了2次，那重试次数就是4次
* 重试机制解决出现网络抖动，则会出现请求失败*/
//引入的是dubbo包 不是spring类型的包   这个注解很重要
//@Service(version = "1.0.0")
/*
@Service(executes = 10)  服务端并发执行（或占用线程池线程数）不能超过10个
@Service(actives= 10)   占用连接的请求的数不能超过10个。
* */
@Service(timeout = 3000,retries = 2,executes = 10) //这个类提供的方法对外发布，将访问的IP 端口 路径 注册到注册中心
public class OrderServiceImpl implements IOrderService {
    //操作数据库要创建mapper层  调用mapper的方法  在pom.xml引入框架

    //用于测试结果缓存
    private AtomicInteger integer = new AtomicInteger();
    //创建订单
    @Override
    public CommonResult createOrders(Orders orders) {
        //TODO 模拟数据库操作
        CommonResult commonResult = new CommonResult();
        //返回的是结果编码
        commonResult.setCode(200);
        //返回结果描述
        commonResult.setMessage("订单创建成功");
        commonResult.setData(null);
        return commonResult;
    }
    //根据用户id查询订单
    @Override
    public CommonResult findUserId(Long id) {

        CommonResult commonResult = new CommonResult();
        //返回的是结果编码
        commonResult.setCode(200);
        //返回结果描述
        commonResult.setMessage("success");
        //TODO 模拟数据库操作
        Orders orders = new Orders();
        orders.setId(1L);
        orders.setUserid(2L);
        orders.setMobile("123222222");
        /*int index = 0;
        index = index+1;
        不可以使用这方式，因为这在单线程没有问题，如果在多线程并发的情况下就有问题了
        ，所以要用下面的原子方式
        */
        //已原子方式将当前的值加一  无限循环加1
        int andIncrement = integer.getAndIncrement();
        orders.setAddress("广东"+andIncrement);
        orders.setPrice(22.5);
        orders.setPay_method(1); //1:微信 2:支付宝
        commonResult.setData(orders);
        return commonResult;

    }
}
